#include "../include/Block.hpp"

Block::Block(int id,int cellSize)
    :_id(id)
    ,_cellSize(cellSize)
    ,_shapes()
    ,_rotation(0)
    ,_RowOffset(0)
    ,_ColOffset(0)
{}

void Block::draw(int offsetx,int offsety)
{
    const std::vector<Color> CellColors(getCellColors());//获取颜色的数组
    VectorPosition NextPosition;//获取最新的方块位置
    if(_shapes.find(_rotation) != _shapes.end())//查看翻转后的形状
    {
        NextPosition = _shapes[_rotation];
        for(const auto& pos : NextPosition)//将当前方块的每一个坐标标志出颜色
        {
            //绘制填充颜色的Rectangle，参数分别为横坐标、纵坐标、宽度、高度、颜色
            //第一个和第二个参数是矩形的左上角x和y坐标
            //第三个参数和第四个参数是矩形的宽度和高度，第五个参数是颜色
            //假设第一个Position为(0,0)，那么左上角坐标为(0,0)
            //由于矩形宽度、高度都是_cellsize - 1
            //那么下一个坐标是(_cellsize,_cellsize)，所有坐标要乘以_cellsize
            
            //注意，第一个参数是x坐标，第二个参数是y坐标
            //以左上角为原点，从左往右为x轴，从上到下是y轴
            //这里直接将col和row颠倒，前面就可以按照习惯
            //从上到下为横坐标x，从左到右是纵坐标y
            DrawRectangle((pos._col + _ColOffset) * _cellSize + offsety,(pos._row + _RowOffset) * _cellSize + offsetx,_cellSize - 1,_cellSize - 1,CellColors[_id]);
        }
    }
}

Block::VectorPosition Block::GetBlockPosition()
{
    std::unordered_map<int,VectorPosition>::iterator it = _shapes.find(_rotation);
    if(it != _shapes.end())
    {
        VectorPosition tiles = it->second;
        VectorPosition moveTiles;
        for(const Position& pos : tiles)//加上偏移量
        {
            moveTiles.push_back({pos._row + _RowOffset,pos._col + _ColOffset});
        }

        return moveTiles;
    }

    return {};
}

unsigned int Block::GetId()
{
    return _id;
}

void Block::move(int row,int col)
{
    _RowOffset += row;
    _ColOffset += col;
}

void Block::rotate()
{
    _rotation += 1;//翻转系数加1
    if(_rotation == (int)_shapes.size())//处理边界问题，翻转系数在shapes是从0开始的
    {
        _rotation = 0;
    }
}

void Block::UndoRotate()
{
    _rotation -= 1;
    if(_rotation == -1)//处理边界问题
    {
        _rotation = _shapes.size() - 1;
    }
}

